/*
 * @lc app=leetcode.cn id=2982 lang=cpp
 *
 * [2982] 找出出现至少三次的最长特殊子字符串 II
 *
 * https://leetcode.cn/problems/find-longest-special-substring-that-occurs-thrice-ii/description/
 *
 * algorithms
 * Medium (38.67%)
 * Likes:    22
 * Dislikes: 0
 * Total Accepted:    11.8K
 * Total Submissions: 23.2K
 * Testcase Example:  '"aaaa"'
 *
 * 给你一个仅由小写英文字母组成的字符串 s 。
 *
 * 如果一个字符串仅由单一字符组成，那么它被称为 特殊 字符串。例如，字符串 "abc" 不是特殊字符串，而字符串 "ddd"、"zz" 和 "f"
 * 是特殊字符串。
 *
 * 返回在 s 中出现 至少三次 的 最长特殊子字符串 的长度，如果不存在出现至少三次的特殊子字符串，则返回 -1 。
 *
 * 子字符串 是字符串中的一个连续 非空 字符序列。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：s = "aaaa"
 * 输出：2
 * 解释：出现三次的最长特殊子字符串是 "aa" ：子字符串 "aaaa"、"aaaa" 和 "aaaa"。
 * 可以证明最大长度是 2 。
 *
 *
 * 示例 2：
 *
 *
 * 输入：s = "abcdef"
 * 输出：-1
 * 解释：不存在出现至少三次的特殊子字符串。因此返回 -1 。
 *
 *
 * 示例 3：
 *
 *
 * 输入：s = "abcaba"
 * 输出：1
 * 解释：出现三次的最长特殊子字符串是 "a" ：子字符串 "abcaba"、"abcaba" 和 "abcaba"。
 * 可以证明最大长度是 1 。
 *
 *
 *
 *
 * 提示：
 *
 *
 * 3 <= s.length <= 5 * 10^5
 * s 仅由小写英文字母组成。
 *
 *
 */
#include <bits/stdc++.h>
using namespace std;
// @lc code=start

class Solution {
public:
    // [2981] 找出出现至少三次的最长特殊子字符串 I 一样（数据范围不同）
    // 精简优雅写法
    int maximumLength(string s) {
        vector<int> groups[26];
        int ans = 0, cnt = 0;
        for (int i = 0; i < s.size(); i++) {
            cnt++;
            if (i == s.size() - 1 || s[i] != s[i + 1]) {
                groups[s[i] - 'a'].push_back(cnt);
                cnt = 0;
            }
        }

        for (auto& group : groups) {
            if (group.empty()) continue;
            sort(group.begin(), group.end(), greater<int>());
            group.push_back(0);
            group.push_back(0);
            ans = max({ans, group[0] - 2, min(group[0] - 1, group[1]), group[2]});
        }
        return ans > 0 ? ans : -1;
    }
};
// @lc code=end
